package com.example.demo.leeCode;


/**
 * 判断一个整数是否是回文数。回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
 *
 * 示例 1:
 *
 * 输入: 121
 * 输出: true
 * 示例 2:
 *
 * 输入: -121
 * 输出: false
 * 解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
 * 示例 3:
 *
 * 输入: 10
 * 输出: false
 * 解释: 从右向左读, 为 01 。因此它不是一个回文数。
 *
 * 进阶:
 *
 * 你能不将整数转为字符串来解决这个问题吗？
 *
 */
public class BackNo {
    public static void main(String[] args) {
        System.out.println(new BackNo().isPalindrome3(190191));
        System.out.println(10%10);
    }

    public boolean isPalindrome1(int x) {
        boolean isPalin = true;
        char [] backNo = (x + "").toCharArray();
        for(int i=0; i<backNo.length/2+1; i++){
            if(backNo[i]!=(backNo[backNo.length-i-1])){
                return isPalin = false;
            }
        }
        return isPalin;
    }

    //取出后半段进行反转
    public boolean isPalindrome2(int x) {
        if(x == Integer.MAX_VALUE || (x%10==0 && x!=0)){
            return false;
        }
        int backNo = 0;
        while(x > backNo){
            backNo = backNo * 10 + x%10;
            x /=10;
        }
        return x==backNo || x==backNo/10;
    }

    //边界判断，先对比最外边的两个值，再依次向内递增
    public boolean isPalindrome3(int x) {
        if(x == Integer.MAX_VALUE || x<0 || (x%10==0 && x!=0)){
            return false;
        }
        int backNo = 1;
        while(x/backNo >= 10){
            backNo *=10;
        }
        while(x>0) {
            int left = x / backNo;
            int right = x % 10;
            if (left != right) {
                return false;
            }
            x = x%backNo/10;
            backNo/=100;
        }

        return true;
    }

    //边界判断，先对比最外边的两个值，再依次向内递增
    public boolean isPalindrome4(int x) {
        //边界判断
        if (x < 0) return false;
        int div = 1;
        //
        while (x / div >= 10) div *= 10;
        while (x > 0) {
            int left = x / div;
            int right = x % 10;
            if (left != right) return false;
            x = (x % div) / 10;
            div /= 100;
        }
        return true;
    }
}
